Update __vmread()
authorlcy@vtsmp-build.sh.intel.com <lcy@vtsmp-build.sh.intel.com>
Sun, 28 Aug 2005 06:55:37 +0000 (14:55 +0800)
committerlcy@vtsmp-build.sh.intel.com <lcy@vtsmp-build.sh.intel.com>
Sun, 28 Aug 2005 06:55:37 +0000 (14:55 +0800)
To make it not to break the stack.

Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
Signed-off-by: Chengyuan Li <chengyuan.li@intel.com>
xen/include/asm-x86/vmx.h

index 0d40e51068dca880eda3dda00413e078b0f7db12..1d9b74dfb5517de32d6ac3e24d834b4591e6b435 100644 (file)
@@ -275,7 +275,9 @@ static inline int __vmpclear (u64 addr)
     return 0;
 }
 
-static inline int __vmread (unsigned long field, void *value)
+#define __vmread(x, ptr) ___vmread((x), (ptr), sizeof(*(ptr)))
+
+static always_inline int ___vmread (const unsigned long field,  void *ptr, const int size)
 {
     unsigned long eflags;
     unsigned long ecx = 0;
@@ -286,7 +288,23 @@ static inline int __vmread (unsigned long field, void *value)
                            : "a" (field)
                            : "memory");
 
-    *((long *) value) = ecx;
+    switch (size) {
+    case 1:
+        *((u8 *) (ptr)) = ecx;
+        break;
+    case 2:
+        *((u16 *) (ptr)) = ecx;
+        break;
+    case 4:
+        *((u32 *) (ptr)) = ecx;
+        break;
+    case 8:
+        *((u64 *) (ptr)) = ecx;
+        break;
+    default:
+        domain_crash_synchronous();
+        break;
+    }
 
     __save_flags(eflags);
     if (eflags & X86_EFLAGS_ZF || eflags & X86_EFLAGS_CF)